# -*- coding：utf-8 -*-
"""
@Time:2024-08-1716:51
@Auth:泛彼泊舟
@File:7、数据类装饰器.py
@IDE:PyCharm
@模块功能：xxx
"""
"""
可以使用对类的装饰器进行数据类的装饰
使用的特点：
1、首先需要导入dataclasses模块
2、使用dataclass装饰器
3、自动为类创建很多特殊方法，包括init魔法方法
4、不需要手动定义init就可以直接使用
5、可以理解成实例属性定义的另外一种格式
"""
import dataclasses


@dataclasses.dataclass
class Girl:
    # 定义数据类的实例属性必须要指定数据类型
    name: str
    age: int
    # 也可以在定义的时候给一个初始值
    height: float = 18.6


    def show(self):
        print("开始表演节目")

g2 = Girl("法外狂徒", 20, 56)
print(g2.name)

# 示例：结合使用多个特性
from dataclasses import dataclass, field
from typing import List

'''
@dataclass 装饰器接受一些参数来控制生成的功能：
1、@dataclass(init=False)，控制是否生成 __init__ 方法。默认为 True
2、@dataclass(repr=False): 控制是否生成 __repr__ 方法。默认为 True
3、@dataclass(eq=False)，控制是否生成 __eq__ 方法。默认为 True。
4、@dataclass(order=True)，控制是否生成比较方法 (__lt__, __le__, __gt__, __ge__)。默认为 False。
5、@dataclass(frozen=True)，控制是否生成不可变的实例，即生成 __setattr__ 方法，使实例不可变。默认为 False。

'''
@dataclass(order=True, frozen=True)
class Person:
    name: str
    age: int
    # field() 函数允许你更细粒度地控制每个字段的行为：
    hobbies: List[str] = field(default_factory=list, repr=False)
    '''
    field() 函数的参数：
    default: 设置字段的默认值。
    default_factory: 使用工厂函数设置默认值
    init: 控制字段是否作为初始化参数。默认为 True
    repr: 控制字段是否包含在 __repr__ 方法中。默认为 True。
    compare: 控制字段是否用于生成比较方法。默认为 True。
    hash: 控制字段是否用于生成 __hash__ 方法。默认为 True。
    '''
# 使用数据类
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)

print(person1)  # 输出: Person(name='Alice', age=30)
print(person1 == person2)  # 输出: False
print(person1 < person2)  # 输出: False (因为 age 是比较的一部分)
